package cn.edu.hunau.basic.day04;

import org.junit.Test;

import java.util.Arrays;
import java.util.Random;

/**
 * @author hb
 * @date 2025-07-31 10:42:51
 */
public class ArraySortTest {

    @Test
    public void testArraysSort(){
        int[] arr = getRandomDataArray(20, 100);
        System.out.println("排序前:"+Arrays.toString(arr));
        Arrays.sort(arr);
        System.out.println("排序后:"+Arrays.toString(arr));
    }

    @Test
    public void testSelectSort() {
        int[] arr = getRandomDataArray(20, 100);
        System.out.println("排序前:"+Arrays.toString(arr));
        selectSort(arr);
        System.out.println("排序后:"+Arrays.toString(arr));
    }

    @Test
    public void testBubbleSort() {
        int[] arr = getRandomDataArray(20, 100);
        System.out.println("排序前:"+Arrays.toString(arr));
        bubbleSort(arr);
        System.out.println("排序后:"+Arrays.toString(arr));
    }

    @Test
    public void testInsertSort() {
        int[] arr = getRandomDataArray(20, 100);
        System.out.println("排序前:"+Arrays.toString(arr));
        insertSort(arr);
        System.out.println("排序后:"+Arrays.toString(arr));
    }

    public void insertSort(int[] arr){
        for(int i=1;i<arr.length;i++){
            int temp=arr[i];//使用temp临时存储数据
            int j=i-1;
            for(;j>=0;j--){
                if(temp<arr[j]){
                    //执行移动
                    arr[j+1]=arr[j];
                    System.out.println("\t:"+Arrays.toString(arr));
                }else{
                    break; //获得插入的位置
                }
            }
            arr[j+1]=temp;
        }
    }

    public void bubbleSort(int[] arr){
        for(int i=0;i<arr.length-1;i++){
           for(int j=0;j<arr.length-i-1;j++){
               if(arr[j]>arr[j+1]){
                   swap(arr,j,j+1);
               }
           }
        }
    }

    /**
     * 选择排序
     * @param arr
     */
    public void selectSort(int[] arr) {
        //使用i表示第一位的数据
        for(int i=0;i<arr.length-1;i++){
            //使用j表示i后面的数据范围
            for(int j=i+1;j<arr.length;j++){
                if(arr[j]<arr[i]){
                    //交换i和j之间的位置
                    swap(arr,i,j);
                }
            }
        System.out.println("\t第"+(i+1)+"轮排序:"+Arrays.toString(arr));
        }
    }

    public void swap(int[] arr,int i,int j ){
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }

    /**
     * 获得随机的数组
     * @param length
     * @param bound
     * @return
     */
    public int[] getRandomDataArray(int length,  int bound) {
        int [] result= new int[length];
        //声明一个标记数组标记数据是否存在
        //随机范围[1,33] 那么如果数据为33,flags[33]需要设置为true
        boolean[] flags =new boolean[bound+1];
        Random r=new Random();
        for(int i=0;i<length;i++){
            int temp= r.nextInt(bound)+1;
            //判断temp是否已经被标记
            if(flags[temp]){//如果为true,表示该数据已经存在
                i--;//重新对i进行计算
                // System.out.println("出现重复");
            }else{
                result[i]=temp;
                //标记该数据的存在
                flags[temp]=true;
            }
        }
        return result;
    }


}
